package gov.pr.celepar.sentinela.admin.action;

import java.util.Collection;

import gov.pr.celepar.sentinela.Constants;
import gov.pr.celepar.sentinela.admin.dao.FuncaoDAO;
import gov.pr.celepar.sentinela.admin.dao.factory.DAOFactoryServer;
import gov.pr.celepar.sentinela.admin.excecao.SentinelaServerException;
import gov.pr.celepar.sentinela.admin.form.BloqueioFuncaoForm;
import gov.pr.celepar.sentinela.admin.pojo.Funcao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class BloqueioFuncaoAction extends BaseAction {

	private static Log logger = LogFactory.getLog(BloqueioFuncaoAction.class);

	public String executar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws SentinelaServerException, Exception {

		listarSistemasAutorizados(request);

		BloqueioFuncaoForm bloqueioFuncaoForm = (BloqueioFuncaoForm) form;

		if (this.CONF_ALTERAR.equalsIgnoreCase(bloqueioFuncaoForm.getAcao())) {
			this.comunicacao.autorizaOperacao('A', request, response);
			alterar(bloqueioFuncaoForm, request);
		}

		if (bloqueioFuncaoForm.getCodSistema() != null
				&& !bloqueioFuncaoForm.getCodSistema().equals(""))
			consultar(bloqueioFuncaoForm, request);

		return "lista_funcoesBloqueados";
	}

	/**
	 * @param form
	 * @param request
	 * @throws SentinelaServerException
	 */
	private void alterar(BloqueioFuncaoForm form, HttpServletRequest request)
			throws SentinelaServerException {
		String bloqueadasForm[] = form.getFuncoesBloqueadas();

		// converte os itens recebidos para long
		int i = 0;
		long codBloqueadasForm[] = null;
		if (bloqueadasForm != null) {
			i = bloqueadasForm.length;
			codBloqueadasForm = new long[i];

			for (int f = 0; f < i; f++) {
				try {
					codBloqueadasForm[f] = Long.parseLong(bloqueadasForm[f]);
				} catch (NumberFormatException e) {
					logger.error("Erro", e);
				}

			}
		}

		// pega a árvore original
		try {
			DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
			FuncaoDAO funcaoB = daoFactory.getFuncaoDAO();
			Collection<Funcao> funcoesBanco = funcaoB.getArvore(Long.decode(form
					.getCodSistema()));

			if (funcoesBanco != null) {

				for(Funcao funcao : funcoesBanco){

					boolean encontrou = false;
					if (codBloqueadasForm != null) {
						for (int h = 0; h < codBloqueadasForm.length; h++) {
							if (funcao.getCodFuncao() == codBloqueadasForm[h])
								encontrou = true;
						}
					}

					if (encontrou) {
						funcao.setBloqueio(true);
						logger.debug("Bloquear fun��o " + funcao.getNome()
								+ " - " + funcao.getCodFuncao());
						funcaoB.alterar(funcao);
					} else if (funcao.getBloqueio()) {
						funcao.setBloqueio(false);
						logger.debug("Desbloquear fun��o " + funcao.getNome()
								+ " - " + funcao.getCodFuncao());
						funcaoB.alterar(funcao);
					}
				}
			}
		} catch (Exception e) {
			logger
					.error("Erro ao efetuar bloqueio/desbloqueio de função...",
							e);
			throw new SentinelaServerException(
					"Erro ao efetuar bloqueio/desbloqueio de função...", e);
		}
		this.addMessageSucess("Alterações efetuadas com sucesso!", request);
	}

	/**
	 * @param form
	 */
	private void consultar(BloqueioFuncaoForm form, HttpServletRequest request) {
		try {
			DAOFactoryServer daoFactory = DAOFactoryServer.getDAOFactory();
			FuncaoDAO funcaoB = daoFactory.getFuncaoDAO();
			Collection<Funcao> arvoreFuncoes = funcaoB.getArvore(Long.decode(form
					.getCodSistema()));

			if (arvoreFuncoes != null && !arvoreFuncoes.isEmpty()) {

				for(Funcao f : arvoreFuncoes){

					int h = f.getNivel();
					while (h > 0) {
						f.setNome(Constants.TAB_HTML + f.getNome());
						h--;
					}
				}
			}
			request.setAttribute("listaFuncoesSistema", arvoreFuncoes);
		} catch (Exception e) {
			logger.error("", e);
		}
	}
}
